Lambdaから起動テンプレートを用いてインスタンスの起動をしてみた

Lambdaから起動テンプレートを用いてインスタンスの起動をしてみた

Lambdaから起動テンプレートを用いてインスタンスの起動をしてみました
Clock Icon2024.09.28

はじめに

こんにちは、アノテーションのなかたです。
今回は、Lambdaから起動テンプレートを用いてインスタンスの起動をしてみました。
今回の構成図はこちらになります。
image.png

やってみる

1. Lambda関数の作成

Python3.12でLambda関数を作成します。名前はstartEC2LaunchTemplateとしました。
以下のコードをデプロイします。

lambda_function.py
import boto3
import os
from botocore.exceptions import ClientError

# AWS EC2クライアントの初期化
ec2_client = boto3.client('ec2')

def lambda_handler(event, context):
    # 環境変数から起動テンプレート名を取得
    launch_template_name = os.environ.get('LAUNCH_TEMPLATE_NAME')

    if not launch_template_name:
        error_msg = "起動テンプレート名が環境変数に設定されていません。"
        print(error_msg)
        return {"statusCode": 400, "body": error_msg}

    try:
        # 起動テンプレートからインスタンスを起動
        response = ec2_client.run_instances(
            LaunchTemplate={
                'LaunchTemplateName': launch_template_name,
                'Version': '$Latest'  # 最新バージョンを使用
            },
            MinCount=1,
            MaxCount=1
        )

        instance_id = response['Instances'][0]['InstanceId']
        success_msg = f"インスタンス {instance_id} が起動テンプレート {launch_template_name} から正常に起動されました。"
        print(success_msg)
        return {"statusCode": 200, "body": success_msg}

    except ClientError as e:
        error_msg = f"インスタンスの起動中にエラーが発生しました: {str(e)}"
        print(error_msg)
        return {"statusCode": 500, "body": error_msg}

こちらのスクリプト作成は、Claude 3.5 Sonnetに作成してもらいました。

また、こちらのコードではLambdaの環境変数を利用しています。
起動テンプレートの名前を設定するため、設定タブ > 環境変数 > 編集より設定します。
スクリーンショット 2024-09-28 19.14.56.png
スクリーンショット 2024-09-28 19.17.19.png
次のように設定します。

キー: `LAUNCH_TEMPLATE_NAME`
値: 起動テンプレートの名前

2. LambdaのIAMロールを変更

先ほどのコードを実行するためには、以下の権限が必要になります。

  • EC2インスタンスの起動権限
  • 起動テンプレートの読み取り権限
  • 起動テンプレート内のIAMインスタンスプロフィールを実行する権限
    起動テンプレート内で使用されているIAMインスタンスプロフィールに対して、iam:PassRole権限が必要です。
    特にこの権限が必要だとは想定しておらず、私は一度エラーを発生させてしまいました。

iam:PassRoleについては、チバユキさんの記事がとてもわかりやすくおすすめです。
https://dev.classmethod.jp/articles/iam-role-passrole-assumerole/

発生したエラー

{
"statusCode": 500,
"body": "インスタンスの起動中にエラーが発生しました: An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. User: arn:aws:sts::xxxxxxxxxxx:assumed-role/startEC2LaunchTemplate-role-xxxxxxx/startEC2LaunchTemplate is not authorized to perform: iam:PassRole on resource: arn:aws:iam::xxxxxxxxxxx:role/xxxxxxxxx-ssm-managed-instance-core-role because no identity-based policy allows the iam:PassRole action."
}

ではこれら3つのIAMポリシーをLambdaに許可していきます。
設定タブのアクセス権限から、実行ロールのリンクにアクセスします。
スクリーンショット 2024-09-28 19.19.33.png
以下のJSONをインラインポリシーとして追加します。ポリシー名は、startEC2LaunchTemplatePolicyとしました。

json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:CreateTags",
                "ec2:RunInstances",
                "ec2:DescribeLaunchTemplates",
                "ec2:DescribeLaunchTemplateVersions"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": [
                "arn:aws:iam::AWS アカウント ID:instance-profile/*",
                "arn:aws:iam::AWS アカウント ID:role/xxxxxxxxx-ssm-managed-instance-core-role"
            ]
        }
    ]
}

xxxxxxxxx-ssm-managed-instance-core-roleには、起動テンプレート内で使用しているIAMインスタンスプロフィール名を挿入します。

3. Lambda関数のテスト

では、実行する条件が整ったのでテストを行います。

Response
{
  "statusCode": 200,
  "body": "インスタンス i-xxxxxxxxx が起動テンプレート SSMManagedInstanceLT から正常に起動されました。"
}

正常に実行が完了しました!
EC2の画面からもインスタンスの起動が確認できています。
スクリーンショット 2024-09-28 19.00.15.png

おわりに

今回の検証では、権限周りで特に苦労しました。
それぞれのサービスにおいて必要な権限が何であるかを把握しておくと、よりIAMポリシーを作成する際のスピードが早くなり、検証をスムーズに進められると感じました。

また今回の検証目的としては、「スポットインスタンスを起動する起動テンプレートの呼び出し」をしたいという考えがありました。
そのため、次の機会にこちらを検証してみようと思います。

参考

https://envader.plus/article/343
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_passrole.html
https://dev.classmethod.jp/articles/get-s3-object-with-python-in-lambda/

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.